﻿/*----------------------------------------------------------------
//  <copyright file="EntityRoleBase.cs" company="MicroCloud@151504200868">
//      Copyright © 2020-2024 MicroCloud Corporation, All rights reserved.
//  </copyright>
//  <site>https://gitee.com/chenmm123/microclouds</site>
//  <last-editor>cmm</last-editor>
//  <last-date>2023-12-06 18:06</last-date>
//----------------------------------------------------------------*/

namespace MicroCloud.Authorization.Entities
{
    #region "数据角色实体基类"
    /// <summary>
    /// 数据角色实体基类
    /// </summary>
    [EventEntityIgnore]
    [ValueGenerate(ValueGenerateRule.Never, ValueGenerateMode.Snowflake)]
    public abstract class EntityRoleBase<TRoleKey> : EntityBase<long>, ILockable, ICreatedTime, IUpdatedTime, IDataVersion
    {
        #region "属性"
        #region "获取或设置 角色编号"
        /// <summary>
        /// 获取或设置 角色编号
        /// </summary>
        [Column("RoleId")]
        [Required]
        [DisplayName("角色编号")]
        public TRoleKey RoleId { get; set; }
        #endregion
        #region "获取或设置 数据实体编号"
        /// <summary>
        /// 获取或设置 数据实体编号
        /// </summary>
        [Column("EntityId")]
        [DisplayName("数据编号")]
        public long EntityId { get; set; }
        #endregion
        #region "获取或设置 数据权限操作"
        /// <summary>
        /// 获取或设置 数据权限操作
        /// </summary>
        [Column("Operation")]
        [DisplayName("数据权限操作")]
        public DataAuthOperation Operation { get; set; }
        #endregion
        #region "获取或设置 过滤条件组Json字符串"
        private string _FilterGroupJson = "";
        /// <summary>
        /// 获取或设置 过滤条件组Json字符串
        /// </summary>
        [Column("FilterGroupJson")]
        [StringMax]
        [DisplayName("过滤条件组")]
        public string FilterGroupJson { get { return _FilterGroupJson; } set { _FilterGroupJson = value.ReplaceNull(); } }
        #endregion

        #region "获取或设置 是否锁定当前信息，ILockable 可装载接口，用于IEnumerable、IQueryable筛选"
        /// <summary>
        /// 获取或设置 是否锁定当前信息
        /// </summary>
        [Column("IsLocked")]
        [DisplayName("是否锁定")]
        public bool IsLocked { get; set; }
        #endregion

        #region "获取或设置 创建时间 ICreatedTime、ICreationAudited  可装载接口，在数据创建时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 创建时间
        /// </summary>
        [Column("CreatedTime")]
        [DisplayName("创建时间")]
        public DateTime CreatedTime { get; set; }
        #endregion

        #region "获取或设置 更新时间 IUpdatedTime、IUpdateAudited 可装载接口，在数据更新时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 更新时间
        /// </summary>
        [Column("UpdatedTime")]
        [DisplayName("更新时间")]
        public DateTime? UpdatedTime { get; set; }
        #endregion

        #region "获取或设置 数据版本 IDataVersion 可装载接口，用于乐观并发处理"
        /// <summary>
        /// 获取或设置 数据版本
        /// 在实体提交验证后（增加、修改）会自动设置一个时间戳值持久化至数据库
        /// 修改、移除时取实体数据库值与提交值比对，如不一致则拒绝提交
        /// </summary>
        [AuditIgnore]
        [Column("DataVersion")]
        [DisplayName("数据版本")]
        public long DataVersion { get; set; }
        #endregion

        #region "获取 过滤条件组信息"
        /// <summary>
        /// 获取 过滤条件组信息
        /// </summary>
        [NotMapped]
        public FilterGroup FilterGroup
        {
            get
            {
                if (FilterGroupJson.IsNullOrEmpty())
                {
                    return null;
                }
                return FilterGroupJson.FromJsonString<FilterGroup>();
            }
        }
        #endregion

        #endregion

    }
    #endregion

}
